"""
用户视图层
"""

import sys

from db import db_handler
from interface import bank_interface, user_interface, shop_interface
from lib import common

# 全局变量，记录用户是否已登录
login_user = None


def register() -> None:
    """用户注册视图"""
    while True:
        username = input('请输入用户名：').strip()
        if db_handler.select(username):
            print('该用户名已经注册，请重新输入！')
            continue

        password = input('请输入密码：').strip()
        re_password = input('请再次输入密码：').strip()

        if password == re_password:
            res = user_interface.register_interface(username, password)
            if res == None:
                print('用户数据保存失败，请重新输入！')
                continue
            print(res[1])
            break
        else:
            print('密码不一致，请重新输入！')
            continue


def login() -> None:
    """用户登录"""
    while True:
        username = input('请输入用户名：').strip()
        password = input('请输入密码：').strip()

        # 调用用户登录接口，并保存返回值
        res = user_interface.login_interface(username, password)
        if res[0] == True:
            global login_user
            login_user = username
            print(f'{username}登陆成功！')
            break
        else:
            print(res[1])


@common.login_auth
def check_balance() -> None:
    """查看余额"""
    balance = user_interface.check_balance_interface(login_user)
    print(f'用户{login_user}的余额为{balance}')


@common.login_auth
def withdraw() -> None:
    """提现"""
    while True:
        sum = input('请输入提现金额：').strip()

        # 判断输入的金额是否为数字
        if not sum.isdigit():
            print('输入的金额有误，请重新输入！')
            continue

        # 将金额转换为int类型
        sum = int(sum)
        res = bank_interface.withdraw_interface(login_user, sum)

        # 打印提示信息
        print(res[1])
        # 判断是否提现成功
        if res[0]:
            break
        else:
            continue


@common.login_auth
def repay() -> None:
    """还款"""
    while True:
        sum = input('请输入还款金额：').strip()
        if sum.isdigit():
            sum = int(sum)
        if sum > 0:
            res = bank_interface.repay_interface(login_user, sum)
            print(res[1])
            if res[0]:
                break
            else:
                continue
        else:
            print('输入的金额有误，请重新输入！')
            continue


@common.login_auth
def transfer() -> None:
    """转账"""
    while True:
        target_user = input('请输入转账目标用户：').strip()
        sum = input('请输入转账金额：').strip()
        if not sum.isdigit():
            print('输入的金额不正确，请重新输入！')
            continue
        sum = int(sum)
        if sum < 0:
            print('输入的金额小于0，请重新输入！')
            continue

        # 调用转账接口
        res = bank_interface.transfer_interface(login_user, target_user, sum)
        print(res[1])
        if res[0]:
            break
        else:
            continue


@common.login_auth
def check_flow() -> None:
    """查看流水"""
    flow_list = bank_interface.check_flow_interface(login_user)
    if flow_list:
        for flow in flow_list:
            print(flow)
    else:
        print('当前没有流水记录！')


@common.login_auth
def shopping():
    """购物"""

    commodity_list = [
        ['兰州牛肉面', 7],
        ['四川担担面', 10],
        ['武汉热干面', 15],
        ['河南烩面', 12],
        ['陕西油泼面', 13]
    ]

    # 初始化临时购物车：{'商品名称: [单价, 数量]'}
    shopping_cart = {}

    while True:
        # 使用枚举获取索引，充当商品编号，起始索引为1
        for index, commodity in enumerate(commodity_list, 1):
            name, price = commodity
            print(f'商品编号{index}；商品名称：{name}；商品价格：{price}')

        choice = input('请输入商品编号（结账请输入"y"，将已选商品放入购物车请输入"n"）：').strip()
        
        # 如果是 y ，且购物车不为空，调用接口进行结账
        if choice == 'y':
            if not shopping_cart:
                print('购物车是空的，不能结账！')
                continue

            else:
                res = shop_interface.shopping_interface(login_user, shopping_cart)

                print(res[1])
                # 结算成功，结束函数运行
                if res[0]:
                    return
                # 结算失败
                else:
                    continue
        elif choice == 'n':
            shop_interface.add_shopping_cart_interface(login_user, shopping_cart)


        if not choice.isdigit():
            print('请输入正确的商品编号！')
            continue

        # 判断商品编号是否在列表中
        choice = int(choice)
        if choice not in range(1, len(commodity_list)+1):
            print('选择的商品不存在，请重新输入！')
            continue

        # 判断余额是否足够
        user_dict = db_handler.select(login_user)
        if user_dict.get('balance') < price:
            print('余额不足！')
            continue

        # 判断商品是否已经在购物车中
        if name in shopping_cart:
            shopping_cart[name][1] += 1
        else:
            shopping_cart[name] = [price, 1]





@common.login_auth
def check_shopping_cart():
    """查看购物车"""
    pass


def admin():
    """管理员功能"""

    import admin

    admin_menu = {
        '1': admin.add_account,
        '2': admin.modify_balance,
        '3': admin.frozen_account,
        '4': admin.unfreezing_accounts,
    }
    while True:
        print("""
        1、添加账户
        2、修改余额
        3、冻结账户
        4、解冻账户
        """)
        choice = input('请输入功能编号：').strip()
        if choice not in admin_menu:
            print('请输入正确的功能编号！')
            continue

        admin_menu.get(choice)()


def exit_program():
    """退出程序"""
    print('感谢使用，再见！')
    sys.exit(0)


# 函数功能字典
menu = {'1': register,
        '2': login,
        '3': check_balance,
        '4': withdraw,
        '5': repay,
        '6': transfer,
        '7': check_flow,
        '8': shopping,
        '9': check_shopping_cart,
        '10': admin,
        '0': exit_program}


def run() -> None:
    """显示菜单并调用功能函数"""
    while True:
        print("""
    ======ATM+购物车======
        1、用户注册      
        2、用户登录      
        3、查看余额      
        4、提现          
        5、还款          
        6、转账         
        7、查看流水      
        8、购物         
        9、查看购物车    
        10、管理员       
                    
        0、退出程序      
    =======   end  ======
            """)
        choice = input('请输入功能编号：').strip()
        if choice not in menu:
            print('请输入正确的功能编号！')
            continue

        menu.get(choice)()
